// https://github.com/klover2/wechatpay-node-v3-ts
// https://wechatpay-api.gitbook.io/wechatpay-api-v3/
// https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/payment-notice.html

const mongoose = require('mongoose');

const { Schema } = mongoose;
// 支付通知
const name = 'WxPayNotify';

const schema = new Schema({
  hotel_id: String,  // 酒店id, 系统生成
  id: { type: String, index: true, unique: true },  // 通知的唯一ID。
  create_time: String, // 通知创建的时间，遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss.表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
  event_type: String, // 通知的类型，支付成功通知的类型为TRANSACTION.SUCCESS。
  resource_type: String, // 通知的资源数据类型，支付成功通知为encrypt-resource。
  resource: { // 通知资源数据。
    algorithm: String, // 对开启结果数据进行加密的加密算法，目前只支持AEAD_AES_256_GCM。
    ciphertext: String, // Base64编码后的开启/停用结果数据密文。
    associated_data: String, // 附加数据。
    original_type: String, // 原始回调类型，为transaction。
    nonce: String, // 加密使用的随机串。
  },
  summary: String, // 回调摘要
  appid: String, // 直连商户申请的公众号或移动应用AppID。
  mchid: String, // 商户的商户号，由微信支付生成并下发。
  out_trade_no: String,  // 商户系统内部订单号，可以是数字、大小写字母_-*的任意组合且在同一个商户号下唯一。
  transaction_id: String, // 微信支付系统生成的订单号。
  trade_type: String, // 交易类型，枚举值：JSAPI：公众号支付 NATIVE：扫码支付 App：App支付 MICROPAY：付款码支付 MWEB：H5支付 FACEPAY：刷脸支付
  trade_state: String, // 交易状态，枚举值：SUCCESS：支付成功 REFUND：转入退款 NOTPAY：未支付 CLOSED：已关闭 REVOKED：已撤销（付款码支付）USERPAYING：用户支付中（付款码支付）PAYERROR：支付失败(其他原因，如银行返回失败)
  trade_state_desc: String, // 交易状态描述。
  bank_type: String, // 银行类型，采用字符串类型的银行标识。银行标识请参考《银行类型对照表》。
  attach: String, // 附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用，实际情况下只有支付完成状态才会返回该字段。
  success_time: String, // 支付完成时间，遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日 13点29分35秒。
  payer: { // 支付者信息
    openid: String, // 用户在直连商户appid下的唯一标识。 下单前需获取到用户的Openid，Openid获取详见 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
  },
  amount: { // 订单金额信息
    total: Number, // 订单总金额，单位为分。
    payer_total: Number, // 用户支付金额，单位为分。
    currency: String, //  CNY：人民币，境内商户号仅支持人民币。
    payer_currency: String, // 用户支付币种。
  },
  scene_info: { // 支付场景信息描述
    device_id: String, // 终端设备号（门店号或收银设备ID）。
  },
  promotion_detail: [{ // 优惠功能，享受优惠时返回该字段
    coupon_id: String, // 券ID。
    name: String, // 优惠名称。
    scope: String, //优惠范围，枚举值：GLOBAL：全场代金券 SINGLE：单品优惠。
    type: String, // 优惠类型，枚举值：CASH：充值型代金券 NOCASH：免充值型代金券
    amount: String, // 优惠券面额。
    stock_id: String, // 活动ID。
    wechatpay_contribute: Number, // 微信出资，单位为分。
    merchant_contribute: Number, // 商户出资，单位为分。
    other_contribute: Number, // 其他出资，单位为分。
    currency: String, // CNY：人民币，境内商户号仅支持人民币。
    goods_detail: [{ // 单品列表信息
      goods_id: String, // 商品编码。
      quantity: Number, // 用户购买的数量。
      unit_price: Number, // 商品单价，单位为分。
      discount_amount: Number, // 商品优惠金额。
      goods_remark: String, // 商品备注信息。
    }]
  }]
}, {
  strict: false,
  optimisticConcurrency: true,
  timestamps: true
});

schema.index({ hotel_id: 1 });

export default mongoose.model(name, schema);
